Préparation des données

Author

P. Pistre - C. Grasland - H. Commenges

Code
library(knitr)
options(max.print="80")
opts_chunk$set(echo=TRUE,
               cache=FALSE,
               prompt=FALSE,
               tidy=FALSE,
               comment=NA,
               message=FALSE,
               warning=FALSE,
               options(scipen=999))
library(dplyr,quietly = T,warn.conflicts = F,verbose = F)
library(sf,quietly = T, verbose=F)
Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE

Introduction

Pour commencer, vous devez télécharger le dossier contenant l’ensembles des données à l’adresse suivante et le décompresser.

Vous allez ensuite créer à l’intérieur un dossier respour y stocker vos propres données et ouvrir un projet R. Enfin vous allez créer un document quarto appel prepare_data.qmd et vous trouver dans la situation suivante.

situation de départ

Vous pouvez désormais recopier les différents fragements de programme présentés ci-dessous qui vont vous permettre de transférer dans votre dossier res les fichiers utiles pour l’étude de votre commune. Une fois l’opération faite, vous pourrez détruire les dossiers data et meta…

RP Logement 2020 (INSEE)

Nous partons des fichiers détail de l’INSEE car, à la différence des tableaux prédéfinis, ils permettent virtuellement toutes les formes de croisement d’indicateurs. Ils sont évidemment très volumineux mais ici vous avez la chance de bénéficier d’une extraction des communes sur lesquelles vous allez travailler

Etape 1 : Importation des données au format R

Comme les fichiers sont d’assez petite taille, on se contentera d’utiliser la fonctionread.csv qui fait partie du R-base :

Code
t1<-Sys.time()
tab<-read.csv("data/rplogmt_13055.csv")
t2<-Sys.time()
paste ("chargement effectué en",t2-t1,"secondes")
dim(tab)
class(tab)

Dans l’exemple choisi (Marseille) le tableau ne comporte que 182735 individus et se charge en moins d’une seconde

Toutefois, si vous êtes amenés à traiter directement des fichiers de l’INSEE comportant plusieurs millions d’enregistrement vous aurez intérêt à utiliser des fonctions plus puissantes comme la fonction read_csv2 du package readr ou, miuex encore, la fonction fread du package data.table

Etape 2 : Sélection des données utiles et sauvegarde au format .RDS

Nos tableaux peuvent être enregistés au format interne de .R ce qui réduira considérablement leur taille par rapport au fichier texte au format .csv qui pèse en général beaucoup plus.

Comme ces données vont nous servir durant tout le projet, elles seront stockées dans le dossier res qui sera spécifique à l’exemple retenu.

Code
## Sauvegarde au format RDS
saveRDS(object = tab,
        file = "res/tabmen.RDS")

Etape 3 : Chargement et sauvegarde des méta-données

Il ne faut surtout pas oublier le fichier des métadonnées qui va permettre de recoder facilement tous les facteurs et de décoder les chiffres correspondant aux classes. On va donc le transformer au format R puis l’enregistrer également dans le dossier res. Noter qu’on utilise cette fois-ci la fonction read.csv2car le séparateur de colonne n’est plus la virgule (ce qu’on lit avec read.csv) mais le point virgule.

Code
# Lecture du fichier de métadonnées
meta<-read.csv2("meta/Dictionnaire variables_logemt_2020.csv")
# Enregistrement dans le dossier data
saveRDS(object = meta,
        file = "res/tabmen_meta.RDS")

Géométries 2020 (IGN)

Les contours des unités spatiales correspondant aux codes de l’INSEE sont produits par l’IGN et disponibles sur le site géoservice en accès libre. En général on récupère un très gros fichier pour la France entière ce qui demande un peu de travail pour extraire juste la zone d’étude. Ici vous avez de la chance puisqu’on vous a déjà extrait le fichier relatif à votre commune

Etape 1 : Importation et transformation au format sf

La cartographie et plus généralement les opérations géométriques sur des données spatiales dans R peuvent facilement être effectuées avec le package sf (spatial features) qui crée des objets ubniques rassemblant à la fois

  • un tableau de données (l’équivalent du fichier .dbf)
  • une géométrie (l’équivalent du fichier .shp)
  • une projection (l’équivalent du fichier .prj)

Lorsqu’on récupère des fonds de carte au format shapefile (.shp) ou dans d’autres formats standards comme GeoJson, la première tâche consiste donc à les convertir au formt sf afin de pouvoir les utiliser facilement dans R. L’importation se fait à l’aide de l’instruction st_read en indiquant juste le nom du fichier .shp à charger. Les autres fichiers (.dbf ou .proj) seront lus également et intégrés dans l’objet qui hérite de la double classe data.frame et sf.

Code
library(sf)
map_iris <- st_read("data/iris_13055.gml")
Reading layer `iris_13055' from data source 
  `/Users/claudegrasland1/worldregio/hackaton2024/data/iris_13055.gml' 
  using driver `GML'
Simple feature collection with 393 features and 7 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 881250.9 ymin: 6232998 xmax: 905587.3 ymax: 6257715
Projected CRS: RGF93 Lambert 93
Code
dim(map_iris)
[1] 393   8
Code
class(map_iris)
[1] "sf"         "data.frame"
Code
kable(head(map_iris,2))
gml_id INSEE_COM NOM_COM IRIS CODE_IRIS NOM_IRIS TYP_IRIS geometryProperty
iris_13055.0 13206 Marseille 6e Arrondissement 301 132060301 Bergers H MULTIPOLYGON (((893856.1 62…
iris_13055.1 13206 Marseille 6e Arrondissement 602 132060602 Vauban-Fénelon H MULTIPOLYGON (((892867.6 62…

Pour faciliter la compatibilité avec d’autres applications, la 8e colonne qui contient le contour des zones est renommée “geometry” plutôt que “geometryProperty”.

Code
st_geometry(map_iris) <-"geometry"

Etape 2 : Visualisation des IRIS de la zone d’étude

Le nouveau tableau ne comporte plus que 393 unités spatiales et 8 colonnes On peut visualiser rapidement le résultat à l’aide de la fonction plotdu package sf :

Code
par(mar=c(0,0,0,0))
plot(map_iris$geometry)

On sauvegarde le résultat dans notre dossier res au format interne de R :

Code
saveRDS(object = map_iris,
        file = "res/map_iris.RDS")

Etape 3 : Carte des arrondissements

Comme nous serons amenés à travailler à plusieurs échelles, nous produisons tout de suite un fonds de carte des arrondissements en utilisant les fonctions d’agrégation du packages sf combinées avec celles de dplyr.

Code
map_arr <- map_iris  %>% group_by(INSEE_COM) %>%
                        summarise(NOM_COM = min(NOM_COM)) %>%
                        st_as_sf()

on vérifie que l’agrégation s’est bien passée :

Code
par(mar=c(0,0,0,0))
plot(map_arr$geometry)

Et on sauvegarde le fonds de carte

Code
saveRDS(object = map_arr,
        file = "res/map_arr.RDS")

Etape 4 : création d’un contour complet de la commune

Enfin, on construit un fonds de carte de l’ensemble de la commune étudiée

Code
# Agrégation
map_com <- map_iris  %>%     mutate(tot = "Marseille") %>%
                        group_by(tot) %>%
                        summarise() %>%
                        st_as_sf()
# Visualisation
par(mar=c(0,0,0,0))
plot(map_com$geometry)

Code
# Sauvegarde
saveRDS(object = map_com,
        file = "res/map_com.RDS")

Etape 5 : Superposition des trois fonds de carte

La fonction plot du package sf permet de superposer des couches cartographiques avec l’instruction add=TRUE. Elle permet également de régler les couleurs des polygones (col=) ainsi que la couleur et l’épaisseur des frontières (border= et lwd=). Lorsqu’on ne souhaite pas remplir les polygones on indique col=NULL.

Code
par(mar=c(0,0,0,0))
plot(map_iris$geometry, col= "lightyellow", border = "gray80", lwd=0.5)
plot(map_arr$geometry, col= NA, border = "gray50", lwd=1, add=TRUE)
plot(map_com$geometry, col= NA, border = "gray30", lwd=2, add=TRUE)

Logement social 2020

Les données sur le logement social sont été téléchargées sur le site du ministère du développement durable :

Etape 1 : Chargement du fichier

On charge le fichier qui comporte 182735 observation et 70 variables

Code
rpls<-read.csv("data/rpls_13055.csv")
kable(head(rpls))
X.1 DROIT DEPCOM CODEPOSTAL LIBCOM NUMVOIE INDREP TYPVOIE NOMVOIE NUMAPPT NUMBOITE ESC COULOIR ETAGE COMPLIDENT ENTREE BAT IMMEU COMPLGEO LIEUDIT QPV TYPECONST NBPIECE SURFHAB CONSTRUCT LOCAT PATRIMOINE ORIGINE FINAN FINANAUTRE CONV NUMCONV DATCONV NEWLOGT CUS DPEDATE DPEENERGIE DPESERRE SRU_EXPIR SRU_ALINEA CODSEGPATRIM LIBSEGPATRIM PMR REG LIBREG DEP LIBDEP EPCI LIBEPCI EPSG X Y PLG_QP PLG_IRIS2021 PLG_ZUS PLG_ZFU PLG_QVA PLG_CODE_COMMUNE2021 QUALITE_VOIE QUALITE_NUMERO QUALITE_XY DISTANCE_PRECISION QUALITE_QP QUALITE_IRIS QUALITE_ZUS QUALITE_ZFU QUALITE_QVA COMAQP COMRIL
1 1 13055 13009 Marseille 9e Arrondissement NA NA NA 55, Traverse de la Gouffonne 103 NA NA NA 0 NA NA NA 184-BT1-1 RESIDENCE LE MASSALIA I NA 2 C 3 65 1995 1998 1998 1 12 12 1 13204199785123110750722399 NA NA NA NA B C 2031 NA SEG001 Marseille Prov. Metropol 1 93 Provence-Alpes-Côte d’Azur 13 Bouches-du-Rhône 200054807 Métropole d’Aix-Marseille-Provence 2154 895698.9 6241946 HZ 404 HZ CSZ HZ 13209 NA NA 11 NA 1 1 1 NA 1 1 1
2 1 13055 13009 Marseille 9e Arrondissement NA NA NA 55, Traverse de la Gouffonne 113 NA NA NA 1 NA NA NA 184-BT1-1 RESIDENCE LE MASSALIA I NA 2 C 3 65 1995 1998 1998 1 12 12 1 13204199785123110750722399 NA NA NA NA B C 2031 NA SEG001 Marseille Prov. Metropol 1 93 Provence-Alpes-Côte d’Azur 13 Bouches-du-Rhône 200054807 Métropole d’Aix-Marseille-Provence 2154 895698.9 6241946 HZ 404 HZ CSZ HZ 13209 NA NA 11 NA 1 1 1 NA 1 1 1
3 1 13055 13009 Marseille 9e Arrondissement NA NA NA 55, Traverse de la Gouffonne 114 NA NA NA 1 NA NA NA 184-BT1-1 RESIDENCE LE MASSALIA I NA 2 C 5 100 1995 1998 1998 1 12 12 1 13204199785123110750722399 NA NA NA NA B C 2031 NA SEG001 Marseille Prov. Metropol 1 93 Provence-Alpes-Côte d’Azur 13 Bouches-du-Rhône 200054807 Métropole d’Aix-Marseille-Provence 2154 895698.9 6241946 HZ 404 HZ CSZ HZ 13209 NA NA 11 NA 1 1 1 NA 1 1 1
4 1 13055 13009 Marseille 9e Arrondissement NA NA NA 55, Traverse de la Gouffonne 202 NA NA NA 0 NA NA NA 184-BT1-2 RESIDENCE LE MASSALIA I NA 2 C 3 65 1995 1998 1998 1 12 12 1 13204199785123110750722399 NA NA NA NA B C 2031 NA SEG001 Marseille Prov. Metropol 1 93 Provence-Alpes-Côte d’Azur 13 Bouches-du-Rhône 200054807 Métropole d’Aix-Marseille-Provence 2154 895698.9 6241946 HZ 404 HZ CSZ HZ 13209 NA NA 11 NA 1 1 1 NA 1 1 1
5 1 13055 13009 Marseille 9e Arrondissement NA NA NA 55, Traverse de la Gouffonne 123 NA NA NA 2 NA NA NA 184-BT1-1 RESIDENCE LE MASSALIA I NA 2 C 3 69 1995 1998 1998 1 12 12 1 13204199785123110750722399 NA NA NA NA B C 2031 NA SEG001 Marseille Prov. Metropol 1 93 Provence-Alpes-Côte d’Azur 13 Bouches-du-Rhône 200054807 Métropole d’Aix-Marseille-Provence 2154 895698.9 6241946 HZ 404 HZ CSZ HZ 13209 NA NA 11 NA 1 1 1 NA 1 1 1
6 1 13055 13009 Marseille 9e Arrondissement NA NA NA 55, Traverse de la Gouffonne 124 NA NA NA 2 NA NA NA 184-BT1-1 RESIDENCE LE MASSALIA I NA 2 C 3 69 1995 1998 1998 1 12 12 1 13204199785123110750722399 NA NA NA NA B C 2031 NA SEG001 Marseille Prov. Metropol 1 93 Provence-Alpes-Côte d’Azur 13 Bouches-du-Rhône 200054807 Métropole d’Aix-Marseille-Provence 2154 895698.9 6241946 HZ 404 HZ CSZ HZ 13209 NA NA 11 NA 1 1 1 NA 1 1 1
Code
saveRDS(rpls,"res/rpls.RDS")

Mais il faut retirer un certain nombre de lignes qui ne correspondent pas à des logements sociaux. On va donc utiliser le critère CONV==1 pour ne conserver que les logements conventionnés.

Code
rpls <- rpls %>% filter(CONV==1)
dim(rpls)
[1] 72772    69

On voit qu’il ne reste plus que 72772 lignes. On sauvegarde le résultat dans le dossier res.

Code
saveRDS(rpls,"res/rpls.RDS")

Etape 2 : Test de superposition géométrique

Le fichier comporte deux colonnes X et Y dont on ignore la projection. On va tester leur superposition sur les fonds de carte précédents pour voir s’il s’agit de la même.

Code
par(mar=c(0,0,0,0))
plot(map_iris$geometry, col= "lightyellow", border = "gray80", lwd=0.5)
plot(map_arr$geometry, col= NA, border = "gray50", lwd=1, add=TRUE)
plot(map_com$geometry, col= NA, border = "gray30", lwd=2, add=TRUE)
points(rpls$X, rpls$Y, col="red",pch=20, cex=0.2)

Bingo, la superposition est parfaite donc la projection est la même. Il s’agit de la Lambert93 dont le CRS peut-être affiché par la commande st_crs() du package sf :

Code
st_crs(map_iris)
Coordinate Reference System:
  User input: RGF93 Lambert 93 
  wkt:
PROJCRS["RGF93 Lambert 93",
    BASEGEOGCRS["RGF93 geographiques (dms)",
        DATUM["Reseau Geodesique Francais 1993 v1",
            ELLIPSOID["GRS 1980",6378137,298.257222101,
                LENGTHUNIT["metre",1]]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433]],
        ID["IGNF","RGF93G"]],
    CONVERSION["LAMBERT-93",
        METHOD["Lambert Conic Conformal (2SP)",
            ID["EPSG",9802]],
        PARAMETER["Latitude of false origin",46.5,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8821]],
        PARAMETER["Longitude of false origin",3,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8822]],
        PARAMETER["Latitude of 1st standard parallel",44,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8823]],
        PARAMETER["Latitude of 2nd standard parallel",49,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8824]],
        PARAMETER["Easting at false origin",700000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8826]],
        PARAMETER["Northing at false origin",6600000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8827]]],
    CS[Cartesian,2],
        AXIS["easting (X)",east,
            ORDER[1],
            LENGTHUNIT["metre",1]],
        AXIS["northing (Y)",north,
            ORDER[2],
            LENGTHUNIT["metre",1]],
    USAGE[
        SCOPE["NATIONALE A CARACTERE LEGAL"],
        AREA["FRANCE METROPOLITAINE (CORSE COMPRISE)"],
        BBOX[41,-5.5,52,10]],
    ID["IGNF","LAMB93"]]

Il s’agit de la projection Lambert93 utilisée en France oar l’INSEE et l’IGN.

Etape 3 : Carte des logements sociaux

On va alors pouvoir créer un fonds de carte géométrique de ces logements sociaux en indiquant la projection du fonds de carte des Iris.

Code
# Transformation du data.frame en objet sf
rpls_geom<-st_as_sf(rpls,coords = c("X","Y"))

# Récupération du code EPSG de la projection
st_crs(rpls_geom)<-st_crs(map_iris)

# Sauvegarde au format .RDS
saveRDS(rpls_geom, "res/rpls_geom.RDS")

Bilan

Nous avons désormais un dossier res qui comporte tous les éléments utiles pour l’analyse de notre zone d’étude.

  1. Le recensement des logements ordinaires en 2020 et ses métadonnées
  2. Les fonds de carte par iris, arrondissement et commune.
  3. Le fichier du RPLS pour l’année 2020 en version statistique ou cartographique
Code
list.files("res")
[1] "logt_adr.RDS"     "map_arr.RDS"      "map_com.RDS"      "map_iris_hlm.RDS"
[5] "map_iris.RDS"     "rpls_geom.RDS"    "rpls.RDS"         "tabmen_meta.RDS" 
[9] "tabmen.RDS"